package com.dbms.parser.ast;

import com.dbms.catalogInParse.Column;
import com.dbms.common.Constants;
import com.dbms.common.Position;

import java.util.List;

/**
 * CreateTableNode (创建表节点) 代表了 `CREATE TABLE` 语句的抽象语法树 (AST) 结构。
 * 【已修改】这个版本增加了 `foreignKeys` 列表，使其能够解析和存储外键约束的定义。
 */
public class CreateTableNode extends StatementNode {
    /**
     * 要创建的表的名称。
     */
    private final String tableName;
    /**
     * 表的列定义列表。
     */
    private final List<Column> columns;
    /**
     * 【新增字段】表的外键约束定义列表。
     */
    private final List<ForeignKeyNode> foreignKeys;

    /**
     * 构造函数，用于创建一个包含表名、列和外键定义的节点。
     * @param position 语句在原始 SQL 中的位置
     * @param tableName 表名
     * @param columns 列定义列表
     * @param foreignKeys 外键定义列表
     */
    public CreateTableNode(Position position, String tableName, List<Column> columns, List<ForeignKeyNode> foreignKeys) {
        super(position);
        this.tableName = tableName;
        this.columns = columns;
        this.foreignKeys = foreignKeys; // 初始化新增字段
    }

    /**
     * 返回语句的类型标识。
     * @return "CreateTable" 常量
     */
    @Override
    public String getStatementType() {
        return Constants.STATEMENT_CREATE_TABLE;
    }

    /**
     * 获取表名。
     * @return 表名字符串
     */
    public String getTableName() {
        return tableName;
    }

    /**
     * 获取列定义列表。
     * @return 列定义对象的列表
     */
    public List<Column> getColumns() {
        return columns;
    }

    /**
     * 【新增 Getter】获取外键约束定义列表。
     * @return ForeignKeyNode 对象的列表
     */
    public List<ForeignKeyNode> getForeignKeys() {
        return foreignKeys;
    }

    /**
     * 生成该节点的字符串表示，方便调试。
     * @return 描述该节点的字符串
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("CreateTableNode{\n")
                .append("    tableName='").append(tableName).append("',\n")
                .append("    columns=[\n");
        for (Column column : columns) {
            sb.append("        ").append(column).append(",\n");
        }
        sb.append("    ],\n")
                .append("    foreignKeys=[\n");
        for (ForeignKeyNode fk : foreignKeys) {
            sb.append("        ").append(fk).append(",\n");
        }
        sb.append("    ]\n")
                .append("}");
        return sb.toString();
    }
}